/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estsapp.controladores.ABMProducto;


import autocompletar.logica.ModeloAutoCompletar;
import estsapp.controladores.ABMClasificacionProducto.ControladorABMClasificacionProducto;
import estsapp.controladores.ABMRutaFabricacion.ControladorABMRutaFabricacion;
import estsapp.controladores.Controlador;
import estsapp.controladores.ControladorPrincipal;
import estsapp.controladores.FabricaControladores;
import estsapp.entidades.ClasificacionProducto;
import estsapp.entidades.DetalleProducto;
import estsapp.entidades.Material;
import estsapp.entidades.ModeloGestionStock;
import estsapp.entidades.Pieza;
import estsapp.entidades.ProductoTerminado;
import estsapp.expertos.ExpertoABMMaterial;
import estsapp.expertos.ExpertoABMProductoTerminado;
import estsapp.expertos.FabricaExpertos;
import estsapp.expertos.excepciones.ABMProductoTerminadoException;
import estsapp.utiles.filtrosTexto.AgregarFiltroTextField;
import estsapp.utiles.modeloComboGenerico.ModeloComboGenerico;
import estsapp.utiles.modeloTabla.ModeloTabla;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import persistencia.exceptions.ExcepcionFachada;

/**
 *
 * @author diego
 */
public class ControladorABMProductoTerminado implements Controlador {

    private PantallaABMProducto pantalla;
    private ExpertoABMProductoTerminado experto;
    ExpertoABMMaterial consultarMaterial;
    private ProductoTerminado productoSeleccionado;
    private PantallaProductoTerminadoJDialog pantallaProductoJDialog;
    private DetalleProducto componenteProductoSeleccionado;
    private boolean iniciado = false;

    public ControladorABMProductoTerminado() {
        pantalla = new PantallaABMProducto();
        pantallaProductoJDialog = new PantallaProductoTerminadoJDialog(null, true);
        pantallaProductoJDialog.setLocationRelativeTo(null);
        pantallaProductoJDialog.getAutoCompletarComponente().setLabel("Pieza");
        


        experto = (ExpertoABMProductoTerminado) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ABM_PRODUCTO_TERMINADO);
        consultarMaterial = (ExpertoABMMaterial) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ABM_MATERIAL);
        pantalla.getTblProductos().setModel(new ModeloTablaProductos());
        pantalla.getTblProductos().getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                seleccionarProducto();
            }
        });
        pantalla.getTblProductos().addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 2) {
                    seleccionarProducto();
                    modificarProducto();
                }
            }
        });

        /**
         * ###################################################################################
         * ###################################################################################
         * Barra herramientas
         * ###################################################################################
         * ###################################################################################
         */
        pantalla.getBtnNuevo().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                nuevoProducto();
            }
        });
        pantalla.getBtnModificar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                modificarProducto();
            }
        });
        pantalla.getBtnSalir().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                salir();
            }
        });
        pantalla.getBtnRutaFabricacion().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                verRutaFabricacion();
            }
        });
        pantalla.getBtnBaja().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                darBaja();
            }
        });


        /**
         * ###################################################################################
         * ###################################################################################
         * JDialog Producto Terminado
         * ###################################################################################
         * ###################################################################################
         */
        AgregarFiltroTextField.filtroNumeroDecimal(pantallaProductoJDialog.getTxtPorcentaje(),4);
        AgregarFiltroTextField.filtroNumeroDecimal(pantallaProductoJDialog.getTxtCantidad(), 4);
        AgregarFiltroTextField.filtroNumeroDecimal(pantallaProductoJDialog.getTxtCostoAlmacenamiento(), 3);
        
        pantallaProductoJDialog.getTblEstructura().setModel(new ModeloTablaEstructuraProducto());
        pantallaProductoJDialog.getTblEstructura().getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                seleccionarComponenteProducto();
            }
        });

        pantallaProductoJDialog.getBtnGuardar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                guardarProducto();
            }
        });
        pantallaProductoJDialog.getBtnAgregarComponente().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                agregarComponenteProducto();
            }
        });
        pantallaProductoJDialog.getBtnQuitar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                quitarComponente();
            }
        });
        pantallaProductoJDialog.getBtnNuevaClasificacion().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                nuevaClasificacion();
            }
        });
        pantallaProductoJDialog.getTxtCantidad().addFocusListener(new FocusListener() {
            @Override
            public void focusGained(FocusEvent e) {
                seleccionarUnidadMedida();
            }

            @Override
            public void focusLost(FocusEvent e) {
                //
            }
        });
        pantallaProductoJDialog.getBtnNuevoDetalle().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                limpiarCamposAgregarProducto();
            }
        });


    }

    @Override
    public JInternalFrame getPantalla() {
        return pantalla;
    }

    @Override
    public void iniciar() {
        if (!iniciado) {
            ((ControladorPrincipal) FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.PRINCIPAL)).agregarPantallaInterna(pantalla);
            iniciado = true;
        }
        pantalla.setVisible(true);
        ((ModeloTablaProductos) pantalla.getTblProductos().getModel()).setListaElementos(experto.buscarProductosVigentes());

        pantallaProductoJDialog.getCbxClasificación().setModel(new ModeloComboGenerico(experto.buscarClasificacionesProductos()));
        pantallaProductoJDialog.getCbxModeloGestStock().setModel(new ModeloComboGenerico(experto.buscarModelosGestionStock()));

        pantallaProductoJDialog.getAutoCompletarComponente().setModelo(new ModeloAutoCompletar(consultarMaterial.buscarPiezas()));
        if (pantallaProductoJDialog.getTxtNombre().getText().length() > 0 && iniciado) {//esta iniciado y se estaba ingresando un producto
            pantallaProductoJDialog.setVisible(true);
        }

    }

    private void nuevoProducto() {
        limpiarCampos();
        pantallaProductoJDialog.getAutoCompletarComponente().setModelo(new ModeloAutoCompletar(consultarMaterial.buscarPiezas()));
        abrirPantallaProductoTerminado();
    }

    public void limpiarCampos() {
        productoSeleccionado = null;
        pantallaProductoJDialog.limpiarCampos();
    }

    public void abrirPantallaProductoTerminado() {
        pantallaProductoJDialog.setVisible(true);
    }

    public void guardarProducto() {
        if (productoSeleccionado == null) {
            productoSeleccionado = new ProductoTerminado();
        }

        productoSeleccionado.setNombre(pantallaProductoJDialog.getTxtNombre().getText());
        productoSeleccionado.setPorcentajeGanancia(Float.valueOf(pantallaProductoJDialog.getTxtPorcentaje().getText()));
        productoSeleccionado.setClasificacion((ClasificacionProducto) ((ModeloComboGenerico) pantallaProductoJDialog.getCbxClasificación().getModel()).getItemSeleccionado());
        productoSeleccionado.setDescripcion(pantallaProductoJDialog.getTxtDescripcion().getText());
        productoSeleccionado.setCostoAlmacenamiento(Float.valueOf(pantallaProductoJDialog.getTxtCostoAlmacenamiento().getText()));
        List estructuraProdcuto = ((ModeloTablaEstructuraProducto) pantallaProductoJDialog.getTblEstructura().getModel()).getListaElementos();
        productoSeleccionado.setDetalles(estructuraProdcuto);
        ModeloGestionStock modeloStock = null;
        if(pantallaProductoJDialog.getCbxModeloGestStock().getSelectedIndex() > 0){
            modeloStock = (ModeloGestionStock) ((ModeloComboGenerico)pantallaProductoJDialog.getCbxModeloGestStock().getModel()).getItemSeleccionado();
        }
        productoSeleccionado.getStock().setModelo(modeloStock);
        try {
            experto.guardar(productoSeleccionado);
        } catch (ABMProductoTerminadoException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            return;
        } catch (ExcepcionFachada ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
            return;
        }
        agregarProductoTabla(productoSeleccionado);
        JOptionPane.showMessageDialog(pantalla, "Producto Guardado Correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        pantallaProductoJDialog.setVisible(false);
        limpiarCampos();

    }

    private void agregarProductoTabla(ProductoTerminado producto) {
        List productos = ((ModeloTablaProductos) pantalla.getTblProductos().getModel()).getListaElementos();
        for (Object object : productos) {
            if (producto.equals(object)) {
                return;
            }
        }
        ((ModeloTablaProductos) pantalla.getTblProductos().getModel()).addRow(producto);
    }

    private void agregarComponenteProducto() {
        if (pantallaProductoJDialog.getAutoCompletarComponente().getTexto().length() == 0) {
            return;
        }

        if (componenteProductoSeleccionado == null) {
            componenteProductoSeleccionado = new DetalleProducto();
        }
        Pieza pieza = (Pieza) pantallaProductoJDialog.getAutoCompletarComponente().getItemSeleccionado();
        componenteProductoSeleccionado.setCantidad(Float.valueOf(pantallaProductoJDialog.getTxtCantidad().getText()));
        componenteProductoSeleccionado.setPieza(pieza);
        componenteProductoSeleccionado.setUnidadMedida(pantallaProductoJDialog.getCbxUnidadMedida().getSelectedItem().toString());

        for (Object object : ((ModeloTabla) pantallaProductoJDialog.getTblEstructura().getModel()).getListaElementos()) {
            if (((DetalleProducto) object).getPieza().equals(pieza)) {
                ((ModeloTabla) pantallaProductoJDialog.getTblEstructura().getModel()).fireTableDataChanged();
                limpiarCamposAgregarProducto();
                return;
            }
        }

        ((ModeloTablaEstructuraProducto) pantallaProductoJDialog.getTblEstructura().getModel()).addRow(componenteProductoSeleccionado);
        limpiarCamposAgregarProducto();


    }

    private void limpiarCamposAgregarProducto() {
        pantallaProductoJDialog.getAutoCompletarComponente().setTexto("");
        pantallaProductoJDialog.getTxtCantidad().setText("");
        pantallaProductoJDialog.getCbxUnidadMedida().setSelectedIndex(0);
        componenteProductoSeleccionado = null;
    }

    private void seleccionarProducto() {
        limpiarCampos();
        int fila = pantalla.getTblProductos().getSelectedRow();
        if (fila == -1) {
            return;
        }
        int filaModelo = pantalla.getTblProductos().convertRowIndexToModel(fila);
        productoSeleccionado = (ProductoTerminado) ((ModeloTabla) pantalla.getTblProductos().getModel()).getRow(filaModelo);
        mostrarProducto(productoSeleccionado);
    }

    private void mostrarProducto(ProductoTerminado producto) {
        pantallaProductoJDialog.getTxtNombre().setText(producto.getNombre());
        pantallaProductoJDialog.getTxtPorcentaje().setText(producto.getPorcentajeGanancia().toString());
        ((ModeloComboGenerico) pantallaProductoJDialog.getCbxClasificación().getModel()).setItemSeleccionado(producto.getClasificacion());
        pantallaProductoJDialog.getTxtDescripcion().setText(producto.getDescripcion());
        pantallaProductoJDialog.getTxtCostoAlmacenamiento().setText(producto.getCostoAlmacenamiento().toString());
        ((ModeloTablaEstructuraProducto) pantallaProductoJDialog.getTblEstructura().getModel()).setListaElementos(producto.getDetalles());
        if(producto.getStock().getModelo()!=null){
            ((ModeloComboGenerico)pantallaProductoJDialog.getCbxModeloGestStock().getModel()).setItemSeleccionado(producto.getStock().getModelo());
        }else{
            pantallaProductoJDialog.getCbxModeloGestStock().setSelectedIndex(0);
        }
    }

    private void modificarProducto() {
        if (productoSeleccionado != null) {
            pantallaProductoJDialog.setVisible(true);
        }
    }

    private void nuevaClasificacion() {
        pantallaProductoJDialog.setVisible(false);
        ControladorABMClasificacionProducto controladorABMClasificacion = (ControladorABMClasificacionProducto) FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.ABM_CLASIFICACION_PRODUCTO);
        controladorABMClasificacion.setIngresandoProductoTerminado(true);
        controladorABMClasificacion.iniciar();
    }

    private void salir() {
        pantalla.setVisible(false);
    }

    private void seleccionarComponenteProducto() {
        int fila = pantallaProductoJDialog.getTblEstructura().getSelectedRow();
        if (fila == -1) {
            return;
        }
        int filaModelo = pantallaProductoJDialog.getTblEstructura().convertRowIndexToModel(fila);
        componenteProductoSeleccionado = (DetalleProducto) ((ModeloTabla) pantallaProductoJDialog.getTblEstructura().getModel()).getRow(filaModelo);

        pantallaProductoJDialog.getAutoCompletarComponente().setItemSeleccionado(componenteProductoSeleccionado.getPieza().getNombreElemento());
        pantallaProductoJDialog.getTxtCantidad().setText(componenteProductoSeleccionado.getCantidad().toString());
        pantallaProductoJDialog.getCbxUnidadMedida().setSelectedItem(componenteProductoSeleccionado.getUnidadMedida());

    }

    private void quitarComponente() {
        if (componenteProductoSeleccionado == null) {
            return;
        }
        List detalles = ((ModeloTabla) pantallaProductoJDialog.getTblEstructura().getModel()).getListaElementos();
        for (int i = 0; i < detalles.size(); i++) {
            if (((DetalleProducto) detalles.get(i)).getPieza().getCodigo().equals(componenteProductoSeleccionado.getPieza().getCodigo())) {
                ((ModeloTabla) pantallaProductoJDialog.getTblEstructura().getModel()).removeRow(i);
                limpiarCamposAgregarProducto();
                return;
            }
        }
    }

    private void seleccionarUnidadMedida() {
        if (pantallaProductoJDialog.getAutoCompletarComponente().getItemSeleccionado() != null) {
            Pieza pieza = (Pieza) pantallaProductoJDialog.getAutoCompletarComponente().getItemSeleccionado();
            if (pieza instanceof Material) {
                pantallaProductoJDialog.getCbxUnidadMedida().setSelectedItem(((Material) pieza).getUnidadMedida());
            } else {
                pantallaProductoJDialog.getCbxUnidadMedida().setSelectedItem("unidad");
            }
        }
    }

    private void verRutaFabricacion() {
        if (productoSeleccionado == null) {
            return;
        }
        ControladorABMRutaFabricacion controladorRutaFabricacion = (ControladorABMRutaFabricacion) FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.ABM_RUTA_DE_FABRICACION);
        controladorRutaFabricacion.setProducto(productoSeleccionado);
        controladorRutaFabricacion.iniciar();
    }

    private void darBaja() {
        if (productoSeleccionado == null) {
            return;
        }
        int confirmado = JOptionPane.showConfirmDialog(
                pantalla,
                "¿Desea dar baja al producto: " + productoSeleccionado.getNombre() + "?");
        if (JOptionPane.OK_OPTION == confirmado) {
            try {
                experto.darDeBaja(productoSeleccionado);
            } catch (ABMProductoTerminadoException ex) {
                JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
                return;
            } catch (ExcepcionFachada ex) {
                JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
                return;
            }

            JOptionPane.showMessageDialog(pantalla, "El Producto seleccionado fue dado de baja correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            ((ModeloTabla)pantalla.getTblProductos().getModel()).removeElement(productoSeleccionado);
            productoSeleccionado = null;
            limpiarCampos();
        }
    }
}
